<?php

namespace Library;

/**
 * +---------------------------------------------------+ 
 * +        红包接口，裂变红包        +
 * +---------------------------------------------------+
 * 
 * 注意：
 * 1、微信红包金额最小不能小于 1元
 * 2、如发送的金额小于 1元时，只能选择企业付款
 * 3、为保证安全性 请求时要带上签名
 *     \__  先以 Util::generateSignature 方法生成签名
 * 		|_  在之前的参数基础上增加  signature、timestamp、nonce 这三个验证 签名的参数
 */
use \Org\Util\SendWallet;
use \Org\Util\WalletWeixinUtil;

class WxPay {
    private $sendWallet;
    private $wx_pay_order_model;
    private static $_instance;

    public function __construct() {
        $options = array(
            'appid' => C('WX_APPID'), //
            'mchid' => C('WX_MCHID'), //
            'key' => C('WX_KEY'), //
            'sslcert_path' => C('WX_SSLCERT_PATH'), //
            'sslkey_path' => C('WX_SSLKEY_PATH'), // 
            'sslrootca_path' => C('WX_SSLROOTCA_PATH'), //
            'DEBUG' => false,
        );
        $this->wx_pay_order_model = D('wx_pay_order');
        $this->sendWallet = new SendWallet($options);
    }

    public function __clone() {
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }
//
//    public static function getInstance() {
//        if (!(self::$_instance instanceof self)) {
//            self::$_instance = new self;
//        }
//        return self::$_instance;
//    }
    
    /* 生成订单号
     * mch_id+yyyymmdd+10  
     */
    public function get_mch_billno() {
        return C('WX_MCHID').date("Ymd").mt_rand(1000000000, 9999999999);
    }

    public function sen_tx_hb($info) {
        $info['mch_billno'] = $this->get_mch_billno();
        $SendRedpack = $this->sendWallet; //红包 与 企业付款公用 类
        $SendRedpack->set_mch_billno($info['mch_billno']);      //唯一订单号
        //$SendRedpack->set_mch_id( WxPayConf_pub::MCHID ); 	     	// 商户号 默认已在配置文件中配置
        //$SendRedpack->set_wxappid( WxPayConf_pub::APPID );			// appid  默认已在配置文件中配置               // 提供方名称     
        $SendRedpack->set_send_name($info['send_name']);
        // 红包发送者名称  商户名称
        $SendRedpack->set_re_openid($info['openid']);     // 用户在wxappid下的openid

        $SendRedpack->set_total_amount($info['amount']);  // 付款金额，单位分
        $SendRedpack->set_total_num(1);       // 红包发放总人数
        $SendRedpack->set_wishing($info['wishing']);    // 红包祝福语 感谢您参加猜灯谜活动，祝您元宵节快乐！
        $SendRedpack->set_client_ip(WalletWeixinUtil::getRealIp()); //调用接口的机器Ip地址

        $SendRedpack->set_act_name($info['act_name']);  // 活动名称 猜灯谜抢红包活动
        $SendRedpack->set_remark($info['remark']);     // 备注信息 猜越多得越多，快来抢！
        $SendRedpack->set_nonce_str(WalletWeixinUtil::getNonceStr()); // 随机字符串
        // 得到签名和其它设置的 xml 数据
        $getNewData = $SendRedpack->getSendRedpackXml($SendRedpack);
        $data = $this->sendWallet->curl_post_ssl($getNewData['api_url'], $getNewData['xml_data']);
        $res = @simplexml_load_string($data, NULL, LIBXML_NOCDATA);

        if (!empty($res)) {
            \Think\Log::record(json_encode($res));
            $this->save_order_info($info, 2, 1);
            return TRUE;
        } else {
            \Think\Log::record(array('return_code' => 'FAIL', 'return_msg' => 'redpack_接口出错', 'return_ext' => array()));
            $this->save_order_info($info, 2, 2);
            return FALSE;
        }
    }
    
    private function save_order_info($info, $hb_type, $status) {
        $data['mch_billno'] = $info['mch_billno'];
        $data['send_listid'] = $info['openid'];
        $data['send_name'] = $info['send_name'];
        $data['total_amount'] = $info['amount'];
        $data['openid'] = $info['openid'];
        $data['status'] = $status;  //1、 成功  2、 失败 
        $data['wishing'] = $info['wishing'];
        $data['act_name'] = $info['act_name'];
        $data['remark'] = $info['remark'];
        $data['pay_type'] = $hb_type;  //1、 普通红包， 2、提现红包
        $data['time'] = date("Y-m-d H:i:s",time());
        
        $this->wx_pay_order_model->add($data);
        \Think\Log::record($this->wx_pay_order_model->getLastSql());
    }

    public function get_order_status($info){
        $SendRedpack = $this->sendWallet; //红包 与 企业付款公用 类
        $SendRedpack->set_mch_billno($info['mch_billno']);      //唯一订单号
        $SendRedpack->set_nonce_str(WalletWeixinUtil::getNonceStr()); // 随机字符串

        // 得到签名和其它设置的 xml 数据
        $getNewData = $SendRedpack->gethbinfo($SendRedpack);
        $data = $this->sendWallet->curl_post_ssl($getNewData['api_url'], $getNewData['xml_data']);
        $res = @simplexml_load_string($data, NULL, LIBXML_NOCDATA);

        if (!empty($res)) {
            \Think\Log::record(json_encode($getNewData['xml_data']));
            \Think\Log::record(json_encode($res));
            return TRUE;
        } else {
            \Think\Log::record(array('return_code' => 'FAIL', 'return_msg' => 'redpack_接口出错', 'return_ext' => array()));
            return FALSE;
        }
    }
}
